﻿#define _CRT_SECURE_NO_WARNINGS
//
//#include<iostream>
//#include<assert.h>
//
//using namespace std;
//
//class stack
//{
//public:
//	//成员变量
//	
//		void Init(int n = 4)       //此处可以利用缺省参数的特点传参
//		{
//			array = (int*)malloc(sizeof(int) * n);
//			if (nullptr == array)
//			{
//				perror("malloc申请空间失败");
//				return;
//			}
//			capacity = n;
//			top = 0;
//		}
//		void Push(int x)
//		{
//			// ...扩容
//			array[top++] = x;
//		}
//		int Top()
//		{
//			assert(top > 0);
//			return array[top - 1];
//		}
//		void Destroy()
//		{
//			free(array);
//			array = nullptr;
//			top = capacity = 0;
//		}
//	private:
//		// 成员变量
//		int* array;
//		size_t capacity;
//		size_t top;
//	}; // 分号不能省略
//
//class Date
//{
//public:
//	void Init(int year, int mon, int day)
//	{
//		_year = year;
//		_mon = mon;
//		_day = day;
//	}
//
//private:
//		// 为了区分成员变量，⼀般习惯上成员变量
//		// 会加⼀个特殊标识，如_ 或者 m开头
//		int _year; // year_ m_year
//		int _mon;
//		int _day;	
//
//};
//
//
//	int main()
//	{
//		stack st;
//		st.Init();
//		st.Push(1);
//		st.Push(2);
//		cout << st.Top() << endl;
//		st.Destroy();
//
//		Date d;
//		d.Init(2024, 8, 8);
//		return 0;
//	}
	
//#include<iostream>
//using namespace std;
//class Date
//{
//public:
//	void Init(int year, int month, int day)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//private:
//	// 这⾥只是声明，没有开空间
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	// Date类实例化出对象d1和d2
//	Date d1;
//	Date d2;
//	d1.Init(2002,1,6);
//	d1.Print();
//	d2.Init(2001,11,1);
//	d2.Print();
//	return 0;
//}

//#include<iostream>
//using namespace std;
//// 计算⼀下A/B/C实例化的对象是多⼤？
//class A
//{
//public:
//	void Print()
//	{
//		cout << _ch << endl;
//	}
//private:
//	char _ch;
//	int _i;
//
//};
//class B
//{
//public:
//	void Print()
//	{
//		//...
//	}
//};
//
//class C
//{};
//int main()
//{
//	A a;
//	B b;
//	C c;
//	cout << sizeof(a) << endl;
//	cout << sizeof(b) << endl;
//	cout << sizeof(c) << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class Date
//{
//public:
//	void Init(int year, int month, int day)
//	//void Init(Date* const this, int year, int month, int day)
//	{
//	
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//private:
//	// 这⾥只是声明，没有开空间
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	// Date类实例化出对象d1和d2
//	Date d1;
//	Date d2;
//	d1.Init(2002, 1, 6);
//	d1.Print();
//	d2.Init(2001, 11, 1);
//	d2.Print();
//	return 0;
//}
#include<iostream>
#include<assert.h>
using namespace std;
typedef int STDataType;
class Stack
{
public:
	// 成员函数
	void Init(int n = 4)
	{
		_a = (STDataType*)malloc(sizeof(STDataType) * n);
		if (nullptr == _a)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = n;
		_top = 0;
	}
	void Push(STDataType x)
	{
		if (_top == _capacity)
		{
			int newcapacity = _capacity * 2;
			STDataType* tmp = (STDataType*)realloc(_a, newcapacity *
				sizeof(STDataType));
			if (tmp == NULL)
			{
				perror("realloc fail");
				return;
			}
			_a = tmp;
			_capacity = newcapacity;
		}
		_a[_top++] = x;
	}
	void Pop()
	{
		assert(_top > 0);
		--_top;
	}
	bool Empty()
	{
		return _top == 0;
	}
	int Top()
	{
		assert(_top > 0);
		return _a[_top - 1];
	}
	void Destroy()
	{
		free(_a);
		_a = nullptr;
		_top = _capacity = 0;
	}
private:
	// 成员变量
	STDataType* _a;
	size_t _capacity;
	size_t _top;
};
int main()
{
	Stack s;
	s.Init();
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Push(4);
	while (!s.Empty())
	{
		printf("%d\n", s.Top());
		s.Pop();
	}
	s.Destroy();
	return 0;
}